package com.ribbon.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @ClassName: RibbonService
 * @Author: ZhangYue26
 * @Description:
 * @Date: 2021-01-08
 */
@Service
public class RibbonService {

    @Autowired
    private RestTemplate restTemplate;

    /**
      * @Description 注意，RestTemplate可以通过服务名称调用某个服务的接口  服务名替换了 ip:port
      * @author ZhangYue26
      * @date 2021/1/8
      * @param [name]
      * @return java.lang.String
      **/
    /** @HystrixCommand 该注解作用是启用Hystrix熔断器功能
        fallbackMethod 为处理回退（fallback）逻辑的方法。在本例中， 直接返回了一个字符串。在熔断器打开的状态下，会执行 fallback 逻辑。
        fall back 的逻辑最好是返回一些静态的字符串，不需要处理复杂的逻辑，也不需要远程调度其 他服务，这样方便执行快速失败，释放线程资源。
        如果一定要在 fallback 逻辑中远程调度其他服务，最好在远程调度其他服务时，也加上熔断器。
        fallbackMethod指定的是执行返回失败方法的名称，TODO 注意是方法名称，并不是一个简单随意的字符串*/
    @HystrixCommand(fallbackMethod = "hiError")
    public String hi(String name) {
        return restTemplate.getForObject("http://eureka-ribbon-client/getName?name=" + name, String.class);
    }

    /**
     * @Description 测试多个相同服务相同接口，查询负载均衡效果，（轮询效果）  服务名替换了 ip:port
     * @author ZhangYue26
     * @date 2021/1/8
     * @return java.lang.String
     **/
    public String testMoreServices() {
        return restTemplate.getForObject("http://eureka-server-colony-1/test", String.class);
    }

    /**
      * @Description 熔断器注解 HystrixCommand 指定的失败执行逻辑
      * @author ZhangYue26
      * @date 2021/1/13
      * @param [name]
      * @return java.lang.String
      **/
    public String hiError(String name) {
        return "程序出现错误";
    }


}
